}
static long
-rgb_to_cmyk (int src_bands,
- void **src,
- int *src_pitch,
- int dst_bands,
- void **dst,
- int *dst_pitch,
+rgb_to_cmyk (void *src,
+ void *dst,
long n)
{
- BABL_PLANAR_SANITY
-
while (n--)
{
- double red = *(double*)src[0];
- double green = *(double*)src[1];
- double blue = *(double*)src[2];
+ double red = ((double*)src)[0];
+ double green = ((double*)src)[1];
+ double blue = ((double*)src)[2];
double cyan, magenta, yellow, key;
yellow = 0.0;
}
- *(double*)dst[0] = cyan;
- *(double*)dst[1] = magenta;
- *(double*)dst[2] = yellow;
- *(double*)dst[3] = key;
-
- if (dst_bands > 4) /* alpha passthorugh */
- *(double*)dst[4] = (src_bands>3)?*(double*)src[3]:1.0;
+ ((double*)dst)[0] = cyan;
+ ((double*)dst)[1] = magenta;
+ ((double*)dst)[2] = yellow;
+ ((double*)dst)[3] = key;
- BABL_PLANAR_STEP
+ src+=4*sizeof(double);
+ dst+=4*sizeof(double)
}
return n;
}
static long
-cmyk_to_rgb (int src_bands,
- void **src,
- int *src_pitch,
- int dst_bands,
- void **dst,
- int *dst_pitch,
- long n)
+cmyk_to_rgb (void *src,
+ void *dst,
+ long n)
{
- BABL_PLANAR_SANITY
-
while (n--)
{
- double cyan = *(double*)src[0];
- double yellow = *(double*)src[1];
- double magenta = *(double*)src[2];
- double key = *(double*)src[3];
+ double cyan = ((double*)src)[0];
+ double yellow = ((double*)src)[1];
+ double magenta = ((double*)src)[2];
+ double key = ((double*)src)[3];
double red, green, blue;
green = 1.0 - magenta;
blue = 1.0 - yellow;
- *(double*)dst[0] = red;
- *(double*)dst[1] = green;
- *(double*)dst[2] = blue;
+ ((double*)dst)[0] = red;
+ ((double*)dst)[1] = green;
+ ((double*)dst)[2] = blue;
- if (dst_bands > 3) /* alpha passthorugh */
- *(double*)dst[3] = (src_bands>4)?*(double*)src[4]:1.0;
+ ((double*)dst)[3] = 1.0;
- BABL_PLANAR_STEP
+ src+=4*sizeof(double);
+ dst+=4*sizeof(double)
}
return n;
}
-#if 0
-static long
-rgb_to_and_from_cmy (int src_bands,
- void **src,
- int *src_pitch,
- int dst_bands,
- void **dst,
- int *dst_pitch,
- long n)
-{
- BABL_PLANAR_SANITY
-
- while (n--)
- {
- int band;
- for (band=0; band< 3; band++)
- {
- *(double*)dst[band] = 1.0F- (*(double*) src[band]);
- }
- for (;band<dst_bands && band<src_bands;band++)
- {
- *(double*)dst[band] = *(double*) src[band];
- }
- for (;band<dst_bands;band++)
- {
- *(double*)dst[band] = 1.0; /* alpha */
- }
- BABL_PLANAR_STEP
- }
-}
-#endif
-
static void
conversions (void)
{
babl_conversion_new (
- "babl-base: rgba to cmy",
+ "babl-base: rgba to cmyk",
"source", babl_model_id (BABL_RGBA),
"destination", babl_model_id (BABL_CMYK),
- "planar", rgb_to_cmyk,
+ "linear", rgb_to_cmyk,
NULL
);
babl_conversion_new (
- "babl-base: cmy to rgba",
+ "babl-base: cmyk to rgba",
"source", babl_model_id (BABL_CMYK),
"destination", babl_model_id (BABL_RGBA),
- "planar", cmyk_to_rgb,
+ "linear", cmyk_to_rgb,
NULL
);
}
formats (void)
{
}
-
static long
-rgb_to_gray (int src_bands,
- void **src,
- int *src_pitch,
- int dst_bands,
- void **dst,
- int *dst_pitch,
- long n)
+rgba_to_graya (void *src,
+ void *dst,
+ long n)
{
- BABL_PLANAR_SANITY
while (n--)
{
double red, green, blue;
double luminance, alpha;
- red = *(double *)src[0];
- green = *(double *)src[1];
- blue = *(double *)src[2];
- if (src_bands>3)
- alpha = *(double *)src[3];
- else
- alpha = 1.0;
+ red = ((double *)src)[0];
+ green = ((double *)src)[1];
+ blue = ((double *)src)[2];
+ alpha = ((double *)src)[3];
luminance = red * RGB_LUMINANCE_RED +
green * RGB_LUMINANCE_GREEN +
blue * RGB_LUMINANCE_BLUE;
- *(double*)dst[0] = luminance;
- if (dst_bands==2)
- *(double*)dst[1] = alpha;
+ ((double*)dst)[0] = luminance;
+ ((double*)dst)[1] = alpha;
- BABL_PLANAR_STEP
+ src += sizeof (double) * 4;
+ dst += sizeof (double) * 2;
+ }
+ return n;
+}
+
+static long
+rgba_to_gray (void *src,
+ void *dst,
+ long n)
+{
+ while (n--)
+ {
+ double red, green, blue;
+ double luminance, alpha;
+
+ red = ((double *)src)[0];
+ green = ((double *)src)[1];
+ blue = ((double *)src)[2];
+ alpha = ((double *)src)[3];
+
+ luminance = red * RGB_LUMINANCE_RED +
+ green * RGB_LUMINANCE_GREEN +
+ blue * RGB_LUMINANCE_BLUE;
+
+ ((double*)dst)[0] = luminance;
+
+ src += sizeof (double) * 4;
+ dst += sizeof (double) * 1;
}
return n;
}
static long
-gray_to_rgb (int src_bands,
- void **src,
- int *src_pitch,
- int dst_bands,
- void **dst,
- int *dst_pitch,
- long n)
+graya_to_rgba (void *src,
+ void *dst,
+ long n)
{
- BABL_PLANAR_SANITY
while (n--)
{
double luminance;
double red, green, blue;
double alpha;
- luminance = *(double *)src[0];
+ luminance = ((double *)src)[0];
+ alpha = ((double *)src)[1];
red = luminance;
green = luminance;
blue = luminance;
- if (src_bands > 1)
- alpha = *(double *)src[1];
- else
- alpha = 1.0;
- *(double*)dst[0] = red;
- *(double*)dst[1] = green;
- *(double*)dst[2] = blue;
+ ((double*)dst)[0] = red;
+ ((double*)dst)[1] = green;
+ ((double*)dst)[2] = blue;
+ ((double*)dst)[3] = alpha;
- if (dst_bands>3)
- *(double*)dst[3] = alpha;
+ src += sizeof(double)*2;
+ dst += sizeof(double)*4;
+ }
+ return n;
+}
- BABL_PLANAR_STEP
+
+static long
+gray_to_rgba (void *src,
+ void *dst,
+ long n)
+{
+ while (n--)
+ {
+ double luminance;
+ double red, green, blue;
+
+ luminance = ((double *)src)[0];
+ red = luminance;
+ green = luminance;
+ blue = luminance;
+
+ ((double*)dst)[0] = red;
+ ((double*)dst)[1] = green;
+ ((double*)dst)[2] = blue;
+ ((double*)dst)[3] = 1.0;
+
+ src += sizeof(double)*1;
+ dst += sizeof(double)*4;
}
return n;
}
babl_conversion_new (
babl_model_id (BABL_GRAY),
babl_model_id (BABL_RGBA),
- "planar", gray_to_rgb,
- NULL
- );
-
- babl_conversion_new (
- babl_model_id (BABL_GRAY),
- babl_model_id (BABL_RGB),
- "planar", gray_to_rgb,
+ "linear", gray_to_rgba,
NULL
);
babl_conversion_new (
babl_model_id (BABL_GRAY_ALPHA),
babl_model_id (BABL_RGBA),
- "planar", gray_to_rgb,
- NULL
- );
-
- babl_conversion_new (
- babl_model_id (BABL_GRAY_ALPHA),
- babl_model_id (BABL_RGB),
- "planar", gray_to_rgb,
+ "linear", graya_to_rgba,
NULL
);
babl_conversion_new (
babl_model_id (BABL_RGBA),
babl_model_id (BABL_GRAY_ALPHA),
- "planar", rgb_to_gray,
+ "linear", rgba_to_graya,
NULL
);
babl_conversion_new (
babl_model_id (BABL_RGBA),
babl_model_id (BABL_GRAY),
- "planar", rgb_to_gray,
- NULL
- );
-
- babl_conversion_new (
- babl_model_id (BABL_RGB),
- babl_model_id (BABL_GRAY_ALPHA),
- "planar", rgb_to_gray,
- NULL
- );
-
- babl_conversion_new (
- babl_model_id (BABL_RGB),
- babl_model_id (BABL_GRAY),
- "planar", rgb_to_gray,
+ "linear", rgba_to_gray,
NULL
);
babl_component_id (BABL_ALPHA),
NULL);
- babl_format_new (
- "id", BABL_RGBA_DOUBLE,
- babl_model_id (BABL_RGBA),
- babl_type_id (BABL_DOUBLE),
- babl_component_id (BABL_RED),
- babl_component_id (BABL_GREEN),
- babl_component_id (BABL_BLUE),
- babl_component_id (BABL_ALPHA),
- NULL);
-
babl_format_new (
"id", BABL_RGB_FLOAT,
babl_model_id (BABL_RGB),
}
static long
-rgb_to_ycbcr (int src_bands,
- void **src,
- int *src_pitch,
- int dst_bands,
- void **dst,
- int *dst_pitch,
- long n)
+rgba_to_ycbcra (void *src,
+ void *dst,
+ long n)
{
- BABL_PLANAR_SANITY
-
while (n--)
{
- double red = *(double*)src[0];
- double green = *(double*)src[1];
- double blue = *(double*)src[2];
+ double red = ((double*)src)[0];
+ double green = ((double*)src)[1];
+ double blue = ((double*)src)[2];
+ double alpha = ((double*)src)[3];
double luminance, cb, cr;
cb = -0.168736 * red -0.331264 * green +0.5 * blue;
cr = 0.5 * red -0.418688 * green -0.081312 * blue;
- *(double*)dst[0] = luminance;
- *(double*)dst[1] = cb;
- *(double*)dst[2] = cr;
-
- if (dst_bands > 3) /* alpha passthorugh */
- *(double*)dst[3] = (src_bands>3)?*(double*)src[3]:1.0;
+ ((double*)dst)[0] = luminance;
+ ((double*)dst)[1] = cb;
+ ((double*)dst)[2] = cr;
+ ((double*)dst)[3] = alpha;
- BABL_PLANAR_STEP
+ src += sizeof (double) * 4;
+ dst += sizeof (double) * 4;
}
return n;
}
+
static long
-ycbcr_to_rgb (int src_bands,
- void **src,
- int *src_pitch,
- int dst_bands,
- void **dst,
- int *dst_pitch,
- long n)
+rgba_to_ycbcr (void *src,
+ void *dst,
+ long n)
{
- BABL_PLANAR_SANITY
+ while (n--)
+ {
+ double red = ((double*)src)[0];
+ double green = ((double*)src)[1];
+ double blue = ((double*)src)[2];
+
+ double luminance, cb, cr;
+
+ red = linear_to_gamma_2_2 (red);
+ green = linear_to_gamma_2_2 (green);
+ blue = linear_to_gamma_2_2 (blue);
+
+ luminance = 0.299 * red +0.587 * green +0.114 * blue;
+ cb = -0.168736 * red -0.331264 * green +0.5 * blue;
+ cr = 0.5 * red -0.418688 * green -0.081312 * blue;
+
+ ((double*)dst)[0] = luminance;
+ ((double*)dst)[1] = cb;
+ ((double*)dst)[2] = cr;
+
+ src += sizeof (double) * 4;
+ dst += sizeof (double) * 3;
+ }
+ return n;
+}
+static long
+ycbcra_to_rgba (void *src,
+ void *dst,
+ long n)
+{
while (n--)
{
- double luminance = *(double*)src[0];
- double cb = *(double*)src[1];
- double cr = *(double*)src[2];
+ double luminance = ((double*)src)[0];
+ double cb = ((double*)src)[1];
+ double cr = ((double*)src)[2];
+ double alpha = ((double*)src)[3];
double red, green, blue;
green = gamma_2_2_to_linear (green);
blue = gamma_2_2_to_linear (blue);
- *(double*)dst[0] = red;
- *(double*)dst[1] = green;
- *(double*)dst[2] = blue;
+ ((double*)dst)[0] = red;
+ ((double*)dst)[1] = green;
+ ((double*)dst)[2] = blue;
+ ((double*)dst)[3] = alpha;
+
+ src += sizeof (double) * 4;
+ dst += sizeof (double) * 4;
+ }
+ return n;
+}
- if (dst_bands > 3) /* alpha passthorugh */
- *(double*)dst[3] = (src_bands>3)?*(double*)src[3]:1.0;
- BABL_PLANAR_STEP
+static long
+ycbcr_to_rgba (void *src,
+ void *dst,
+ long n)
+{
+ while (n--)
+ {
+ double luminance = ((double*)src)[0];
+ double cb = ((double*)src)[1];
+ double cr = ((double*)src)[2];
+
+ double red, green, blue;
+
+ red = 1.0 * luminance + 0.0 * cb + 1.40200 * cr;
+ green = 1.0 * luminance - 0.344136 * cb - 0.71414136 * cr;
+ blue = 1.0 * luminance + 1.772 * cb + 0.0 * cr;
+
+ red = gamma_2_2_to_linear (red);
+ green = gamma_2_2_to_linear (green);
+ blue = gamma_2_2_to_linear (blue);
+
+ ((double*)dst)[0] = red;
+ ((double*)dst)[1] = green;
+ ((double*)dst)[2] = blue;
+ ((double*)dst)[3] = 1.0;
+
+ src += sizeof (double) * 3;
+ dst += sizeof (double) * 4;
}
return n;
}
babl_conversion_new (
babl_model_id (BABL_RGBA),
babl_model_id (BABL_YCBCR),
- "planar", rgb_to_ycbcr,
+ "linear", rgba_to_ycbcr,
NULL
);
babl_conversion_new (
babl_model_id (BABL_YCBCR),
babl_model_id (BABL_RGBA),
- "planar", ycbcr_to_rgb,
- NULL
- );
- babl_conversion_new (
- babl_model_id (BABL_RGB),
- babl_model_id (BABL_YCBCR),
- "planar", rgb_to_ycbcr,
- NULL
- );
- babl_conversion_new (
- babl_model_id (BABL_YCBCR),
- babl_model_id (BABL_RGB),
- "planar", ycbcr_to_rgb,
+ "linear", ycbcr_to_rgba,
NULL
);
babl_conversion_new (
babl_model_id (BABL_RGBA),
babl_model_id (BABL_YCBCR_ALPHA),
- "planar", rgb_to_ycbcr,
+ "linear", rgba_to_ycbcra,
NULL
);
babl_conversion_new (
babl_model_id (BABL_YCBCR_ALPHA),
babl_model_id (BABL_RGBA),
- "planar", ycbcr_to_rgb,
+ "linear", ycbcra_to_rgba,
NULL
);
}
static void
formats (void)
{
-
babl_format_new (
- "name", "Y'CbCr u8 4:4:4",
+ "name", "Y'CbCr u8",
"id", BABL_YCBCR420,
"planar",
babl_model_id (BABL_YCBCR),
static long
-rgb_to_lab (int src_bands,
- void **src,
- int *src_pitch,
- int dst_bands,
- void **dst,
- int *dst_pitch,
- long n)
+rgba_to_lab (void *src,
+ void *dst,
+ long n)
{
- BABL_PLANAR_SANITY
-
while (n--)
{
- double red = *(double*)src[0];
- double green = *(double*)src[1];
- double blue = *(double*)src[2];
+ double red = ((double*)src)[0];
+ double green = ((double*)src)[1];
+ double blue = ((double*)src)[2];
double L, a, b;
cpercep_rgb_to_space (red, green, blue, &L, &a, &b);
- *(double*)dst[0] = L;
- *(double*)dst[1] = a;
- *(double*)dst[2] = b;
+ ((double*)dst)[0] = L;
+ ((double*)dst)[1] = a;
+ ((double*)dst)[2] = b;
+
+ src += sizeof(double) * 4;
+ dst += sizeof(double) * 3;
+ }
+ return n;
+}
- if (dst_bands > 3) /* alpha passthorugh */
- *(double*)dst[3] = (src_bands>3)?*(double*)src[3]:1.0;
+static long
+lab_to_rgba (void *src,
+ void *dst,
+ long n)
+{
+ while (n--)
+ {
+ double L = ((double*)src)[0];
+ double a = ((double*)src)[1];
+ double b = ((double*)src)[2];
- BABL_PLANAR_STEP
+ double red, green, blue;
+
+ cpercep_space_to_rgb (L, a, b, &red, &green, &blue);
+
+ ((double*)dst)[0] = red;
+ ((double*)dst)[1] = green;
+ ((double*)dst)[2] = blue;
+ ((double*)dst)[3] = 1.0;
+
+ src += sizeof(double) * 3;
+ dst += sizeof(double) * 4;
}
return n;
}
+
static long
-lab_to_rgb (int src_bands,
- void **src,
- int *src_pitch,
- int dst_bands,
- void **dst,
- int *dst_pitch,
- long n)
+rgba_to_laba (void *src,
+ void *dst,
+ long n)
{
- BABL_PLANAR_SANITY
+ while (n--)
+ {
+ double red = ((double*)src)[0];
+ double green = ((double*)src)[1];
+ double blue = ((double*)src)[2];
+ double alpha = ((double*)src)[3];
+
+ double L, a, b;
+ cpercep_rgb_to_space (red, green, blue, &L, &a, &b);
+
+ ((double*)dst)[0] = L;
+ ((double*)dst)[1] = a;
+ ((double*)dst)[2] = b;
+ ((double*)dst)[3] = alpha;
+
+ src += sizeof(double) * 4;
+ dst += sizeof(double) * 4;
+ }
+ return n;
+}
+
+static long
+laba_to_rgba (void *src,
+ void *dst,
+ long n)
+{
while (n--)
{
- double L = *(double*)src[0];
- double a = *(double*)src[1];
- double b = *(double*)src[2];
+ double L = ((double*)src)[0];
+ double a = ((double*)src)[1];
+ double b = ((double*)src)[2];
+ double alpha = ((double*)src)[3];
double red, green, blue;
cpercep_space_to_rgb (L, a, b, &red, &green, &blue);
- *(double*)dst[0] = red;
- *(double*)dst[1] = green;
- *(double*)dst[2] = blue;
+ ((double*)dst)[0] = red;
+ ((double*)dst)[1] = green;
+ ((double*)dst)[2] = blue;
+ ((double*)dst)[3] = alpha;
- if (dst_bands > 3) /* alpha passthorugh */
- *(double*)dst[3] = (src_bands>3)?*(double*)src[3]:1.0;
-
- BABL_PLANAR_STEP
+ src += sizeof(double) * 4;
+ dst += sizeof(double) * 4;
}
return n;
}
babl_conversion_new (
babl_model ("RGBA"),
babl_model ("CIE Lab"),
- "planar", rgb_to_lab,
+ "linear", rgba_to_lab,
NULL
);
babl_conversion_new (
babl_model ("CIE Lab"),
babl_model ("RGBA"),
- "planar", lab_to_rgb,
- NULL
- );
- babl_conversion_new (
- babl_model ("RGB"),
- babl_model ("CIE Lab"),
- "planar", rgb_to_lab,
- NULL
- );
- babl_conversion_new (
- babl_model ("CIE Lab"),
- babl_model ("RGB"),
- "planar", lab_to_rgb,
+ "linear", lab_to_rgba,
NULL
);
babl_conversion_new (
babl_model ("RGBA"),
babl_model ("CIE Lab alpha"),
- "planar", rgb_to_lab,
+ "linear", rgba_to_laba,
NULL
);
babl_conversion_new (
babl_model ("CIE Lab alpha"),
babl_model ("RGBA"),
- "planar", lab_to_rgb,
+ "linear", laba_to_rgba,
NULL
);
#include "babl.h"
#include "util.h"
-static long rgb_to_cmyk (int src_bands,
- void **src,
- int *src_pitch,
- int dst_bands,
- void **dst,
- int *dst_pitch,
- long n);
-static long cmyk_to_rgb (int src_bands,
- void **src,
- int *src_pitch,
- int dst_bands,
- void **dst,
- int *dst_pitch,
- long n);
+static long
+rgba_to_cmyk (void *src,
+ void *dst,
+ long n);
+
+static long
+cmyk_to_rgba (void *src,
+ void *dst,
+ long n);
+
int
init (void)
{
NULL
);
- babl_model_new (
- "name", "CMYKA",
- babl_component ("cyan"),
- babl_component ("magenta"),
- babl_component ("yellow"),
- babl_component ("key"),
- babl_component ("A"),
- NULL
- );
-
babl_conversion_new (
babl_model ("RGBA"),
babl_model ("CMYK"),
- "planar", rgb_to_cmyk,
+ "linear", rgba_to_cmyk,
NULL
);
babl_conversion_new (
babl_model ("CMYK"),
babl_model ("RGBA"),
- "planar", cmyk_to_rgb,
- NULL
- );
-
-
- babl_conversion_new (
- babl_model ("RGBA"),
- babl_model ("CMYKA"),
- "planar", rgb_to_cmyk,
- NULL
- );
-
- babl_conversion_new (
- babl_model ("CMYKA"),
- babl_model ("RGBA"),
- "planar", cmyk_to_rgb,
+ "linear", cmyk_to_rgba,
NULL
);
-
babl_format_new (
"name", "CMYK float",
babl_model ("CMYK"),
return 0;
}
+
static long
-rgb_to_cmyk (int src_bands,
- void **src,
- int *src_pitch,
- int dst_bands,
- void **dst,
- int *dst_pitch,
- long n)
+rgba_to_cmyk (void *src,
+ void *dst,
+ long n)
{
- BABL_PLANAR_SANITY
-
while (n--)
{
- double red = *(double*)src[0];
- double green = *(double*)src[1];
- double blue = *(double*)src[2];
+ double red = ((double*)src)[0];
+ double green = ((double*)src)[1];
+ double blue = ((double*)src)[2];
double cyan, magenta, yellow, key;
- double pullout = 0.8;
+ double pullout = 1.0;
cyan = 1.0 - red;
magenta = 1.0 - green;
yellow = 0.0;
}
- *(double*)dst[0] = cyan;
- *(double*)dst[1] = magenta;
- *(double*)dst[2] = yellow;
- *(double*)dst[3] = key;
+ ((double*)dst)[0] = cyan;
+ ((double*)dst)[1] = magenta;
+ ((double*)dst)[2] = yellow;
+ ((double*)dst)[3] = key;
- if (dst_bands > 4) /* alpha passthorugh */
- *(double*)dst[4] = (src_bands>3)?*(double*)src[3]:1.0;
-
- BABL_PLANAR_STEP
+ src+=4*sizeof(double);
+ dst+=4*sizeof(double);
}
return n;
}
-static long
-cmyk_to_rgb (int src_bands,
- void **src,
- int *src_pitch,
- int dst_bands,
- void **dst,
- int *dst_pitch,
- long n)
+static long
+cmyk_to_rgba (void *src,
+ void *dst,
+ long n)
{
- BABL_PLANAR_SANITY
-
while (n--)
{
- double cyan = *(double*)src[0];
- double magenta = *(double*)src[1];
- double yellow = *(double*)src[2];
- double key = *(double*)src[3];
+ double cyan = ((double*)src)[0];
+ double magenta = ((double*)src)[1];
+ double yellow = ((double*)src)[2];
+ double key = ((double*)src)[3];
double red, green, blue;
green = 1.0 - magenta;
blue = 1.0 - yellow;
- *(double*)dst[0] = red;
- *(double*)dst[1] = green;
- *(double*)dst[2] = blue;
+ ((double*)dst)[0] = red;
+ ((double*)dst)[1] = green;
+ ((double*)dst)[2] = blue;
- if (dst_bands > 3) /* alpha passthorugh */
- *(double*)dst[3] = (src_bands>4)?*(double*)src[4]:1.0;
+ ((double*)dst)[3] = 1.0;
- BABL_PLANAR_STEP
+ src+=4*sizeof(double);
+ dst+=4*sizeof(double);
}
return n;
}